﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace cstdx.Internal;

public  class VarInts
{
	public static int DecodeVarint(byte[] b, ref int pos)
	{
		// 0x7f与常量做与运算实质是保留常量（转换为二进制形式）的后7位数，取值区间为[0,127]
		// 0x3f与常量做与运算实质是保留常量（转换为二进制形式）的后6位数，取值区间为[0,63]
		//
		// 0x80 1000 0000
		// 0x7f 0111 1111
		// 0x40  100 0000
		// 0x3f  011 1111

		int posByte = 6;
		byte bData = b[pos];
		int data = (int)(bData & 0x3f);
		bool bSign = false;

		if ((bData & 0x40) > 0)
		{
			bSign = true;
		}

		if ((bData & 0x80) > 0)
		{
			while (true)
			{
				pos++;
				bData = b[pos];
				data += (int)(bData & 0x7f) << posByte;

				posByte += 7;

				if ((bData & 0x80) <= 0)
				{
					break;
				}
			}
		}
		pos++;

		if (bSign)
		{
			data = -data;
		}
		return data;
	}

}
